---
title: "Data i Dialog - lägesbild"
subtitle: "Kommunrapport"
title-block-banner: "#009ca6"
title-block-banner-color: "#FFFFFF"
author:
name: Magnus Johansson
affiliation: RISE Research Institutes of Sweden
affiliation-url: https://ri.se/shic
orcid: 0000-0003-1669-592X
date: last-modified
params:
fokusKommun: "Uppsala"
jmfKommun: "Enköping"
format:
html:
toc: true
toc-depth: 5
toc-title: "Innehållsförteckning"
embed-resources: true
standalone: true
page-layout: full
mainfont: 'Lato'
monofont: 'Roboto Mono'
code-overflow: wrap
code-tools: true
code-fold: true
number-sections: true
fig-dpi: 96
layout-align: left
linestretch: 1.6
theme:
- materia
- custom.scss
css: styles.css
license: CC BY
fig-width: 9
fig-height: 7
execute:
echo: false
warning: false
message: false
cache: true
editor_options:
markdown:
wrap: 72
chunk_output_type: console
#bibliography: grateful-refs.bib
---
```{r}
#| label: setup
#| include: false
# comment/remove the 2 lines below before running the separate script to generate multiple reports
fokusKommun <- "Uppsala"
jmfKommun <- "Enköping"
library (arrow)
library (ggrepel)
library (car)
library (grateful)
library (kableExtra)
library (readxl)
library (tidyverse)
library (eRm)
library (mirt)
library (psych)
library (ggplot2)
library (psychotree)
library (matrixStats)
library (reshape)
library (knitr)
library (cowplot)
library (formattable)
library (RISEkbmRasch) # devtools::install_github("pgmj/RISEkbmRasch")
library (glue)
library (janitor)
### some commands exist in multiple packages, here we define preferred ones that are frequently used
select <- dplyr:: select
count <- dplyr:: count
recode <- car:: recode
rename <- dplyr:: rename
### setup for visualization
library (ggdist) # for shadeable density slabs
library (ggpp) # for position_dodge2nudge
library (colorspace) # for lightening color palettes
#library(ggiraph) # interactive
theme_did <- function (fontfamily = "Lato" , axissize = 13 , titlesize = 15 ,
margins = 12 , axisface = "plain" , stripsize = 12 ,
panelDist = 0.6 , legendSize = 11 , legendTsize = 12 , ...) {
theme_minimal () +
theme (
text = element_text (family = fontfamily),
axis.title.x = element_text (
margin = margin (t = margins),
size = axissize
),
axis.title.y = element_text (
margin = margin (r = margins),
size = axissize
),
plot.title = element_text (
face = "bold" ,
size = titlesize
),
axis.title = element_text (
face = axisface
),
plot.caption = element_text (
face = "italic"
),
legend.text = element_text (family = fontfamily, size = legendSize),
legend.title = element_text (family = fontfamily, size = legendTsize),
legend.background = element_rect (color = "lightgrey" ),
strip.text = element_text (size = stripsize),
strip.background = element_rect (color = "lightgrey" ),
panel.spacing = unit (panelDist, "cm" , data = NULL ),
...
)
}
```
```{r}
# import item information
itemlabels <- read_excel ("data/RegUaItemlabels.xls" , sheet = 2 ) %>%
filter (! str_detect (itemnr,"^A2_" ))
spssLabels <- read_excel ("data/spssLabels.xls" )
# import data
df.all <- read_parquet ("/Volumes/magnuspjo/RegionUppsala/data/RegUaLHUdata2023.parquet" )
df <- df.all
df <- df %>%
mutate (Årskurs = recode (arskurs,"1='Åk 7';2='Åk 9';3='Gy 2';9=NA;99=NA" , as.factor = TRUE ),
Kön = recode (kon,"99=NA;9=NA;2='Flickor';1='Pojkar'" , as.factor = T),
Kommun = recode (skolkommun,"1='Enköping';2='Heby';3='Håbo';4='Knivsta';
5='Tierp';6='Uppsala';7='Älvkarleby';8='Östhammar'" , as.factor = T),
Skolnamn = str_squish (skola_txt)
) %>%
rename (År = inars)
items.kr <- c ("C2_1" ,"C2_3" ,"C2_4" ,"C2_5" ,"C2_6" ,"C2_8" )
# koda om B15 utifrån födelseland B14_1 för 2023-data
df <- df %>%
mutate (B15 = case_when (År == 2023 & B14_1 == "I Sverige" ~ "10 år eller mer" ,
TRUE ~ B15))
```
```{r}
# skolverket data
skolverket <- read_parquet ("data/2023-08-21_SkolverketData-all_municipalities_in_Stockholm_and_Uppsala.parquet" ) %>%
filter (str_detect (Kommunkod,"^03" ))
# item labels
itemlabelsSV <- data.frame (
variable = skolverket %>%
distinct (variable) %>%
pull (variable),
description = c ("Antal specialpedagoger" ,
"Elever per lärare" ,
"Andel legitimerade lärare" ,
"Totalt antal elever" ,
"Elever per specialpedagog" ,
"Andel elever i 6:e klass med fullständiga betyg" ,
"Medelvärde nationella prov svenska 6:e klass" ,
"Medelvärde nationella prov engelska 6:e klass" ,
"Medelvärde nationella prov matematik 6:e klass" ,
"Medelvärde nationella prov SVA 6:e klass" ,
"Medelvärde nationella prov svenska 9:e klass" ,
"Medelvärde nationella prov engelska 9:e klass" ,
"Medelvärde nationella prov matematik 9:e klass" ,
"Medelvärde nationella prov SVA 9:e klass" ,
"Andel elever i 9:e klass med fullständiga betyg" ,
"Medelvärde meritvärde" ,
"Andel elever i 9:e klass behöriga till yrkesprogram" ,
"Andel elever i 9:e klass behöriga till estetiskt program" ,
"Andel elever i 9:e klass behöriga till sam/ek/hum" ,
"Andel elever i 9:e klass behöriga till natur/teknik"
)
)
skolverket <- left_join (skolverket,itemlabelsSV, by = "variable" )
# grundskola
gr.skolverket <- skolverket %>%
filter (type == "gr" )
viz.gr.skolverket <- gr.skolverket %>%
mutate (År = factor (timePeriod)) %>%
rename (Kommun = Kommunnamn) %>%
group_by (Kommun, År, description) %>%
summarise (Medelvärde = mean (value, na.rm = TRUE ),
Median = median (value, na.rm = TRUE ),
IQR = IQR (value, na.rm = TRUE ),
SD = sd (value, na.rm = TRUE ),
SE = sd (value, na.rm = TRUE )/ sqrt (n ()),
Högsta = max (value, na.rm = TRUE ),
Lägsta = min (value, na.rm = TRUE ),
Antal_skolor = n ())
# demographic data from manual download (not available in database/API)
demogr.skolverket <- read_parquet ("data/skolverketDemografi.parquet" ) %>%
filter (str_detect (kommun_kod,"^03" ))
# get summary data for school years 7 and 9
demogr.skolverket.long <- demogr.skolverket %>%
select (year, skola, skolkommun, elever_arskurs_7, elever_arskurs_9, typ_av_huvudman) %>%
pivot_longer (c (elever_arskurs_7,elever_arskurs_9),
values_to = "antal_elever" ,
names_to = "arskurs" ) %>%
group_by (year, skolkommun, arskurs) %>%
summarise (antal_elever = sum (antal_elever, na.rm = TRUE )) %>%
ungroup () %>%
mutate (arskurs = factor (arskurs, labels = c ("Åk 7" , "Åk 9" )),
year = factor (year))
lhu_tmp <- df %>%
drop_na (Kommun,Årskurs) %>%
group_by (År,Kommun,Årskurs) %>%
summarise (antal_svar = n ()) %>%
ungroup () %>%
mutate (År = factor (År))
svarsfrekvenser <- demogr.skolverket.long %>%
rename (År = year,
Kommun = skolkommun,
Årskurs = arskurs) %>%
mutate (Kommun = factor (Kommun)) %>%
right_join (.,lhu_tmp, by = c ("År" ,"Kommun" ,"Årskurs" )) %>%
drop_na (antal_elever) %>%
mutate (svarsfrekvens = round (100 * antal_svar/ antal_elever,1 ))
```
```{r}
# define theming
RISEpalette0 <- c ("#009ca6" , "#e83c63" , "#ffe500" )
RISEpalette1 <- colorRampPalette (colors = c ("#009ca6" , "#e83c63" , "#ffe500" ))(6 )
#scales::show_col(RISEpalette1)
RISEpalette2 <- colorRampPalette (colors = c ("#009ca6" , "#e83c63" , "#ffe500" ))(8 )
#scales::show_col(RISEpalette2)
gender_colors <- c ("Pojkar" = "#F5A127" , "Flickor" = "#009CA6" )
scale_color_gender <- partial (scale_color_manual, values = gender_colors,
labels = c ("Pojkar" , "Flickor" ))
scale_fill_gender <- partial (scale_fill_manual, values = gender_colors,
labels = c ("Pojkar" , "Flickor" ))
### text sizes
# ax.size <- 10
# title.size <- 12
# legend.size <- 10
# stript.size <- 10
theme_rise <- function (fontfamily = "Lato" , axissize = 13 , titlesize = 15 ,
margins = 12 , axisface = "plain" , stripsize = 12 ,
panelDist = 0.6 , legendSize = 11 , legendTsize = 12 , ...) {
theme_minimal () +
theme (
text = element_text (family = fontfamily),
axis.title.x = element_text (
margin = margin (t = margins),
size = axissize
),
axis.title.y = element_text (
margin = margin (r = margins),
size = axissize
),
plot.title = element_text (
face = "bold" ,
size = titlesize
),
axis.title = element_text (
face = axisface
),
plot.caption = element_text (
face = "italic"
),
legend.text = element_text (family = fontfamily, size = legendSize),
legend.title = element_text (family = fontfamily, size = legendTsize),
legend.background = element_rect (color = "lightgrey" ),
strip.text = element_text (size = stripsize),
strip.background = element_rect (color = "lightgrey" ),
panel.spacing = unit (panelDist, "cm" , data = NULL ),
...
)
}
# these rows are for geom_text() and geom_text_repel() to match font family
# update_geom_defaults("text", list(family = fontfamily)) +
# update_geom_defaults("text_repel", list(family = fontfamily)) +
# update_geom_defaults("textpath", list(family = fontfamily)) +
# update_geom_defaults("texthline", list(family = fontfamily))
source ("LHU_funktioner.R" )
```
## Introduktion
Lägesbilden/rapporten tar sin utgångspunkt i forskning om vilka risk- och skyddsfaktorer som är mest betydelsefulla för barn och unga (0-18 år). Särskilt fokus har lagts vid trygghet och utsatthet.
Rapporten samlar data från olika källor. Primärt används data från skolenkäten Liv och Hälsa Ung (LHU) som besvaras varannat år av årskurs 7, 9 och 2:an i gymnasiet. Det skiljer sig åt hur långa tidsserier som finns för olika frågor eller frågeområden. Vissa teman finnas bara enstaka mätningar av.
KOLADA har använts för att inhämta valda indikatorer på kommunnivå.
Skolverket tillgängliggör data i en databas samt via sin hemsida.
## Demografiska data
:::: {.column-page-left}
::: {.panel-tabset}
### Antal respondenter
```{r}
df %>%
filter (Kommun == fokusKommun) %>%
drop_na (Kön,Årskurs) %>%
group_by (År,Årskurs,Kön) %>%
reframe (Antal = n ()) %>%
ggplot (aes (x = factor (År), y = Antal, color = Kön, group = Kön)) +
geom_line (linewidth = 1 ) +
geom_point (size = 3 ) +
scale_color_gender () +
scale_x_discrete ('Årtal' , guide = guide_axis (n.dodge = 2 )) +
scale_y_continuous (limits = c (0 ,NA )) +
labs (title = paste0 (fokusKommun," - LHU - Antal respondenter per år" ),
subtitle = "Fördelat på kön" ) +
theme_rise () +
facet_wrap (~ Årskurs)
```
### Skolkommun/kön/år
```{r}
#| fig-height: 7
df %>%
drop_na (Kön,Kommun) %>%
group_by (År,Kommun,Kön) %>%
reframe (Antal = n ()) %>%
ggplot (aes (x = factor (År), y = Antal, color = Kön, group = Kön)) +
geom_line (linewidth = 0.9 ) +
geom_point (size = 1.7 ) +
scale_color_manual (values = RISEpalette1[c (1 ,5 )]) +
scale_x_discrete ('Årtal' , guide = guide_axis (n.dodge = 2 )) +
scale_y_continuous (limits = c (0 ,NA )) +
labs (title = "LHU - Antal respondenter per år" ,
subtitle = "Fördelat på skolkommun och kön" ,
caption = "OBS att y-axlarna kan variera mellan kommunerna." ) +
theme_rise () +
facet_wrap (~ Kommun,
scales = "free" )
```
### Svarsfrekvenser
Baserat på data från Skolverket. tyvärr saknas data om gymnasiet.
```{r}
#| fig-height: 7
svarsfrekvenser %>%
ggplot (aes (x = År, y = svarsfrekvens, color = Årskurs, group = Årskurs)) +
geom_line (linewidth = 0.9 ) +
geom_point (size = 1.7 ) +
scale_color_manual ('' ,values = RISEpalette1[c (2 ,4 )]) +
scale_x_discrete ('Årtal' , guide = guide_axis (n.dodge = 2 )) +
scale_y_continuous (limits = c (0 ,100 )) +
labs (title = "LHU - Svarsfrekvens per år" ,
subtitle = "Fördelat på årskurs (data för kön inom årskurser saknas i Skolverkets underlag)" ,
caption = "Datakälla: Skolverket och Liv & Hälsa Ung. \n Skolverkets data innehåller ej könsfördelning på årskursnivå." ,
y = "Svarsfrekvens i %" ) +
theme_rise () +
theme (legend.position = "top" ) +
facet_wrap (~ Kommun,
scales = "free" )
```
### Vistelsetid
```{r}
df %>%
rename (` Hur länge har du bott i Sverige? ` = B15) %>%
filter (År > 2015 ) %>% # finns ingen äldre data på detta
drop_na (Årskurs) %>%
LHUstapelDemografi ("Hur länge har du bott i Sverige?" )
```
### Sexuell läggning
```{r}
df %>%
rename (` Vilken sexuell läggning har du? ` = B10) %>%
filter (! Årskurs == "Åk 7" ) %>% # frågan ställs ej till årskurs 7
filter (År > 2011 ) %>% # finns ingen äldre data på detta
LHUstapelDemografi ("Vilken sexuell läggning har du?" )
```
### Oro för familjens ekonomi (förenklad)
```{r}
demogr <- "Är du orolig för din familjs ekonomi?"
df %>%
filter (Kommun == fokusKommun) %>%
select (B19, Årskurs, År, Kön) %>%
drop_na (Kön,B19,Årskurs) %>%
# mutate(B19 = factor(B19,
# levels = c("Mycket orolig", "Ganska orolig", "Inte särskilt orolig", "Inte alls orolig"),
# ordered = TRUE
# )) %>%
mutate (B19 = car:: recode (B19,"'Mycket orolig' = 'Mycket eller ganska orolig';'Ganska orolig' = 'Mycket eller ganska orolig'" , as.factor = TRUE )) %>%
rename (` Är du orolig för din familjs ekonomi? ` = B19) %>%
filter (År > 2015 ) %>%
group_by (År, Årskurs, Kön) %>%
pivot_longer (demogr) %>%
count (name, value) %>%
#mutate(value = car::recode(value, "NA='Svar saknas'")) %>%
mutate (percent = (100 * n / sum (n)) %>% round (digits = 3 )) %>%
mutate (proportion = (n / sum (n) %>% round (digits = 3 ))) %>%
mutate (sem = sqrt (proportion * (1 - proportion) / sum (n))) %>%
mutate (
lower.95ci = proportion - sem * 1.96 ,
upper.95ci = proportion + sem * 1.96
) %>%
rename (
Svarsalternativ = value,
"Antal svar" = n,
Procent = percent
) %>%
mutate (
Procent = round (Procent, 1 ),
procentText = sprintf ("%1.1f%%" , Procent),
År = factor (År)
) %>%
mutate (Svarsalternativ = factor (Svarsalternativ,
levels = c ("Mycket eller ganska orolig" , "Inte särskilt orolig" , "Inte alls orolig" )
)) %>%
ggplot (aes (x = Svarsalternativ, y = Procent, fill = År, group = År)) +
geom_bar (position = position_dodge (), stat = "identity" ) +
geom_text (aes (label = .data$ "Antal svar" ),
position = position_dodge (width = 0.9 ),
hjust = - 0.22 , vjust = 0.5 , angle = 90 , size = 2.7 ,
color = "darkgrey"
) +
scale_fill_viridis_d (begin = 0.3 , end = 0.9 , option = 7 ) +
scale_x_discrete (guide = guide_axis (n.dodge = 2 )) +
scale_y_continuous (limits = c (0 , 100 ), breaks = seq (0 , 100 , 20 )) +
theme_minimal () +
theme_rise () +
labs (
title = str_wrap (paste0 (demogr)),
subtitle = paste0 (fokusKommun," - andel respondenter på y-axeln." ),
caption = "Siffrorna ovanför staplarna anger antalet respondenter i varje svarskategori. \n
Datakälla: Liv och Hälsa Ung."
) +
facet_wrap (Årskurs~ Kön,
scales = "free_x" ,
ncol = 2 )
```
### Oro för familjens ekonomi (enbart oroliga)
```{r}
demogr <- "Är du orolig för din familjs ekonomi?"
df %>%
filter (Kommun == fokusKommun) %>%
select (B19, Årskurs, År, Kön) %>%
drop_na (Kön,B19) %>%
mutate (B19 = car:: recode (B19,"'Mycket orolig' = 'Mycket eller ganska orolig';'Ganska orolig' = 'Mycket eller ganska orolig'" , as.factor = TRUE )) %>%
rename (` Är du orolig för din familjs ekonomi? ` = B19) %>%
filter (År > 2015 ) %>%
group_by (År, Årskurs, Kön) %>%
pivot_longer (demogr) %>%
count (name, value) %>%
mutate (percent = (100 * n / sum (n)) %>% round (digits = 3 )) %>%
mutate (proportion = (n / sum (n) %>% round (digits = 3 ))) %>%
mutate (sem = sqrt (proportion * (1 - proportion) / sum (n))) %>%
mutate (
lower.95ci = proportion - sem * 1.96 ,
upper.95ci = proportion + sem * 1.96
) %>%
rename (
Svarsalternativ = value,
"Antal svar" = n,
Procent = percent
) %>%
mutate (
Procent = round (Procent, 1 ),
procentText = sprintf ("%1.1f%%" , Procent),
År = factor (År)
) %>%
mutate (Svarsalternativ = factor (Svarsalternativ,
levels = c ("Mycket eller ganska orolig" , "Inte särskilt orolig" , "Inte alls orolig" )
)) %>%
filter (Svarsalternativ == "Mycket eller ganska orolig" ) %>%
ggplot (aes (x = År, y = Procent, color = Kön, fill = Kön, group = Kön)) +
geom_line (alpha = 0.7 ,
linewidth = 1.2 ) +
geom_point (size = 9 ,
alpha = 0.9 ,
shape = 21 ,
stroke = 1.2 ,
fill = "white" ) +
geom_text (aes (label = Procent, color = Kön),
#color = "white",
size = 3.3 ) +
scale_x_discrete (guide = guide_axis (n.dodge = 2 )) +
scale_y_continuous (limits = c (0 , 30 ), breaks = seq (0 , 30 , 5 )) +
scale_color_gender () +
scale_fill_gender () +
theme_minimal () +
theme_rise () +
labs (
title = str_wrap (paste0 (demogr)),
subtitle = paste0 (fokusKommun," - andel respondenter som svarat 'Ganska orolig' eller 'Mycket orolig'." ),
caption = str_wrap ("Svarta siffror indikerar antal respondenter. Vita siffror indikerar andel respondenter (procent). Datakälla: Liv och Hälsa Ung." ,50 )
) +
facet_wrap (~ Årskurs,
ncol = 3 ) +
geom_text (aes (label = .data$ "Antal svar" ),
#position = position_dodge(width = 0.99),
hjust = - 1.1 , vjust = 0.5 , angle = 45 , size = 2.7 ,
color = "black"
) +
coord_cartesian (clip = "off" )
```
:::
::::
## Trygghet
:::: {.column-screen-inset}
::: panel-tabset
### Jämförelse platser/årskurs
```{r}
#| fig-width: 15
trygghet.items <- itemlabels %>%
filter (str_detect (itemnr,"^F1" ))
recode_vec = setNames (trygghet.items$ itemnr, trygghet.items$ item)
df %>%
filter (Kommun == fokusKommun) %>%
mutate (across (starts_with ("F1" ), ~ car:: recode (.x,"'Vistas inte där'=NA" ,as.factor = TRUE ))) %>%
mutate (across (starts_with ("F1" ), ~ car:: recode (.x,"'Ja, oftast' = 'Ja, oftast/alltid';'Ja, alltid' = 'Ja, oftast/alltid'" ,as.factor = TRUE ))) %>%
drop_na (Årskurs) %>%
pivot_longer (starts_with ("F1" )) %>%
group_by (År, Årskurs, Kön, name) %>%
count (name, value) %>%
filter (År > 2012 ) %>%
mutate (percent = (100 * n / sum (n)) %>% round (digits = 3 )) %>%
mutate (proportion = (n / sum (n) %>% round (digits = 3 ))) %>%
mutate (sem = sqrt (proportion * (1 - proportion) / sum (n))) %>%
mutate (
lower.95ci = proportion - sem * 1.96 ,
upper.95ci = proportion + sem * 1.96
) %>%
rename (
Svarsalternativ = value,
"Antal svar" = n,
Procent = percent
) %>%
mutate (
Procent = round (Procent, 1 ),
procentText = sprintf ("%1.1f%%" , Procent),
År = factor (År)
) %>%
rename (itemnr = name) %>%
left_join (trygghet.items, by = "itemnr" ) %>%
filter (Svarsalternativ == "Nej" ) %>%
mutate (Kön = recode (Kön,"NA='Annat/ej svar'" )) %>%
ggplot (aes (x = År, y = Procent, color = Kön, fill = Kön, group = Kön)) +
geom_line (alpha = 0.7 ,
linewidth = 1.2 ) +
geom_point (size = 2 ) +
scale_x_discrete (guide = guide_axis (n.dodge = 2 ), labels = paste0 ("'" ,seq (13 ,23 ,2 ))) +
scale_y_continuous (limits = c (0 , 30 ), breaks = seq (0 , 30 , 5 )) +
scale_color_manual (values = c ("#009CA6" ,"#F5A127" ,"#5C758B" ),labels = c ("Flickor" ,"Pojkar" ,"Annat/ej svar" )) +
theme_rise () +
theme (strip.text.x = element_text (angle = 0 , size = 8 )) +
labs (
title = str_wrap ("Andel som svarat 'Nej' på frågan 'Känner du dig trygg på följande ställen?'" ),
subtitle = paste0 (fokusKommun),
caption = str_wrap ("Datakälla: Liv och Hälsa Ung." ,50 )
) +
facet_grid (Årskurs~ item,
labeller = labeller (item = label_wrap_gen (20 )))
```
### Jämförelse årskurs/platser
Omvänd så det är lättare att se skillnad mellan årskurser.
```{r}
#| fig-width: 11
#| fig-height: 12
trygghet.items <- itemlabels %>%
filter (str_detect (itemnr,"^F1" ))
recode_vec = setNames (trygghet.items$ itemnr, trygghet.items$ item)
df %>%
filter (Kommun == fokusKommun) %>%
mutate (across (starts_with ("F1" ), ~ car:: recode (.x,"'Vistas inte där'=NA" ,as.factor = TRUE ))) %>%
mutate (across (starts_with ("F1" ), ~ car:: recode (.x,"'Ja, oftast' = 'Ja, oftast/alltid';'Ja, alltid' = 'Ja, oftast/alltid'" ,as.factor = TRUE ))) %>%
drop_na (Årskurs) %>%
pivot_longer (starts_with ("F1" )) %>%
group_by (År, Årskurs, Kön, name) %>%
count (name, value) %>%
filter (År > 2012 ) %>%
mutate (percent = (100 * n / sum (n)) %>% round (digits = 3 )) %>%
mutate (proportion = (n / sum (n) %>% round (digits = 3 ))) %>%
mutate (sem = sqrt (proportion * (1 - proportion) / sum (n))) %>%
mutate (
lower.95ci = proportion - sem * 1.96 ,
upper.95ci = proportion + sem * 1.96
) %>%
rename (
Svarsalternativ = value,
"Antal svar" = n,
Procent = percent
) %>%
mutate (
Procent = round (Procent, 1 ),
procentText = sprintf ("%1.1f%%" , Procent),
År = factor (År)
) %>%
rename (itemnr = name) %>%
left_join (trygghet.items, by = "itemnr" ) %>%
filter (Svarsalternativ == "Nej" ) %>%
mutate (Kön = recode (Kön,"NA='Annat/ej svar'" )) %>%
ggplot (aes (x = År, y = Procent, color = Kön, fill = Kön, group = Kön)) +
geom_line (alpha = 0.7 ,
linewidth = 1.2 ) +
geom_point (size = 2 ) +
scale_x_discrete (guide = guide_axis (n.dodge = 2 )) +
scale_y_continuous (limits = c (0 , 25 ), breaks = seq (0 , 25 , 5 )) +
scale_color_manual (values = c ("#009CA6" ,"#F5A127" ,"#5C758B" ),labels = c ("Flickor" ,"Pojkar" ,"Annat/ej svar" )) +
theme_rise () +
theme (strip.text.y = element_text (angle = 0 , size = 10 )) +
labs (
title = str_wrap ("Andel som svarat 'Nej' på frågan 'Känner du dig trygg på följande ställen?'" ),
subtitle = paste0 (fokusKommun),
caption = str_wrap ("Svarta siffror indikerar antal respondenter. Vita siffror indikerar andel respondenter (procent). Datakälla: Liv och Hälsa Ung." ,50 )
) +
facet_grid (item~ Årskurs,
labeller = labeller (item = label_wrap_gen (22 )))
```
### Störst skillnad
```{r}
#| fig-width: 9
df %>%
filter (Kommun == fokusKommun) %>%
mutate (across (starts_with ("F1" ), ~ car:: recode (.x,"'Vistas inte där'=NA" ,as.factor = TRUE ))) %>%
mutate (across (starts_with ("F1" ), ~ car:: recode (.x,"'Ja, oftast' = 'Ja, oftast/alltid';'Ja, alltid' = 'Ja, oftast/alltid'" ,as.factor = TRUE ))) %>%
drop_na (Årskurs) %>%
pivot_longer (starts_with ("F1" )) %>%
group_by (År, Årskurs, Kön, name) %>%
count (name, value) %>%
filter (År > 2012 ) %>%
mutate (percent = (100 * n / sum (n)) %>% round (digits = 3 )) %>%
mutate (proportion = (n / sum (n) %>% round (digits = 3 ))) %>%
mutate (sem = sqrt (proportion * (1 - proportion) / sum (n))) %>%
mutate (
lower.95ci = proportion - sem * 1.96 ,
upper.95ci = proportion + sem * 1.96
) %>%
rename (
Svarsalternativ = value,
"Antal svar" = n,
Procent = percent
) %>%
mutate (
Procent = round (Procent, 1 ),
procentText = sprintf ("%1.1f%%" , Procent),
År = factor (År)
) %>%
ungroup () %>%
rename (itemnr = name) %>%
left_join (trygghet.items, by = "itemnr" ) %>%
filter (Svarsalternativ == "Nej" ) %>%
filter (item %in% c ("I mitt bostadsområde på kvällen/natten" ,
"På buss, tåg eller liknande" ,
"Ute på stan eller i centrum" ,
"På nätet" )) %>%
#mutate(Kön = recode(Kön,"NA='Annat/ej svar'")) %>%
ggplot (aes (x = År, y = Procent, color = Kön, group = Kön)) +
geom_line (alpha = 0.7 ,
linewidth = 1.2 ) +
geom_point (size = 2 ) +
scale_x_discrete (guide = guide_axis (n.dodge = 2 )) +
scale_y_continuous (limits = c (0 , NA ), breaks = seq (0 , 30 , 5 )) +
scale_color_manual (values = c ("#009CA6" ,"#F5A127" ,"#5C758B" ),labels = c ("Flickor" ,"Pojkar" ,"Annat/ej svar" )) +
theme (strip.text.y = element_text (angle = 0 , size = 10 )) +
theme_rise () +
labs (
title = str_wrap ("Andel som svarat 'Nej' på frågan 'Känner du dig trygg på följande ställen?'" ),
subtitle = paste0 (fokusKommun),
caption = str_wrap ("Svarta siffror indikerar antal respondenter. Vita siffror indikerar andel respondenter (procent). Datakälla: Liv och Hälsa Ung." ,50 )
) +
facet_grid (Årskurs~ item,
labeller = labeller (item = label_wrap_gen (22 )))
```
### Störst skillnad roterad
```{r}
df %>%
filter (Kommun == fokusKommun) %>%
mutate (across (starts_with ("F1" ), ~ car:: recode (.x,"'Vistas inte där'=NA" ,as.factor = TRUE ))) %>%
mutate (across (starts_with ("F1" ), ~ car:: recode (.x,"'Ja, oftast' = 'Ja, oftast/alltid';'Ja, alltid' = 'Ja, oftast/alltid'" ,as.factor = TRUE ))) %>%
drop_na (Årskurs) %>%
pivot_longer (starts_with ("F1" )) %>%
group_by (År, Årskurs, Kön, name) %>%
count (name, value) %>%
filter (År > 2012 ) %>%
mutate (percent = (100 * n / sum (n)) %>% round (digits = 3 )) %>%
mutate (proportion = (n / sum (n) %>% round (digits = 3 ))) %>%
mutate (sem = sqrt (proportion * (1 - proportion) / sum (n))) %>%
mutate (
lower.95ci = proportion - sem * 1.96 ,
upper.95ci = proportion + sem * 1.96
) %>%
rename (
Svarsalternativ = value,
"Antal svar" = n,
Procent = percent
) %>%
mutate (
Procent = round (Procent, 1 ),
procentText = sprintf ("%1.1f%%" , Procent),
År = factor (År)
) %>%
rename (itemnr = name) %>%
left_join (trygghet.items, by = "itemnr" ) %>%
filter (Svarsalternativ == "Nej" ) %>%
filter (item %in% c ("I mitt bostadsområde på kvällen/natten" ,
"På buss, tåg eller liknande" ,
"Ute på stan eller i centrum" ,
"På nätet" )) %>%
ggplot (aes (x = År, y = Procent, color = Kön, fill = Kön, group = Kön)) +
geom_line (alpha = 0.7 ,
linewidth = 1.2 ) +
geom_point (size = 2 ) +
scale_x_discrete (guide = guide_axis (n.dodge = 2 )) +
scale_y_continuous (limits = c (0 , NA ), breaks = seq (0 , 30 , 5 )) +
scale_color_gender () +
scale_fill_gender () +
theme_rise () +
theme (strip.text.y = element_text (angle = 0 , size = 10 )) +
labs (
title = str_wrap ("Andel som svarat 'Nej' på frågan 'Känner du dig trygg på följande ställen?'" ),
subtitle = paste0 (fokusKommun),
caption = str_wrap ("Svarta siffror indikerar antal respondenter. Vita siffror indikerar andel respondenter (procent). Datakälla: Liv och Hälsa Ung." ,50 )
) +
facet_grid (item~ Årskurs,
labeller = labeller (item = label_wrap_gen (22 )))
```
:::
::::
## Utsatthet i skolan
Vi börjar med att titta på frågor relaterade till våld och kränkning/mobbning/trakasserier i skolan. Noteras bör att frågorna är ställda så att de frågar om hur det är på skolan (*"Hur tycker du att det är i din skola?"*), inte huruvida enskilda elever upplever att de blir utsatta.
```{r}
items.kr <- c ("C2_1" ,"C2_3" ,"C2_4" ,"C2_5" ,"C2_6" ,"C2_8" )
itemlabels %>%
filter (itemnr %in% items.kr) %>%
kbl_rise (width = 45 )
```
### Svarsfördelning
```{r}
#| column: margin
#| echo: false
df %>%
select (all_of (items.kr)) %>%
RIlistItemsMargin (14 )
```
::: panel-tabset
#### 2023
```{r}
df %>%
filter (Kommun == fokusKommun) %>%
filter (År == 2023 ) %>%
select (all_of (items.kr)) %>%
mutate (across (where (is.factor), ~ fct_rev (.x))) %>%
RIbarstack () +
scale_fill_viridis_d ('Svarskategori' ,
direction = - 1 ,
labels = ~ stringr:: str_wrap (.x, width = 15 )) +
theme_rise () +
labs (title = "Svarsfördelning" ,
subtitle = "Samtliga respondenter 2023." ,
x = "Antal svar" ) +
scale_y_discrete (labels = paste0 (items.kr, " - " , str_wrap (itemlabels %>% filter (itemnr %in% items.kr) %>% pull (item), 15 )))
```
Det är ett ganska stort antal "Vet inte". Vi provar att koda om dem som saknade svar för att få en tydligare bild av svarsfördelningen. Senare kan vi bl.a. titta på antalet "Vet inte" per fråga över tid.
#### 2023 utan "Vet inte"
```{r}
df %>%
filter (Kommun == fokusKommun) %>%
filter (År == 2023 ) %>%
select (all_of (items.kr)) %>%
filter (! if_any (contains ("C2" ), ~ str_detect (.x, "Vet inte" ))) %>%
mutate (across (where (is.factor), ~ fct_rev (.x))) %>%
RIbarstack () +
scale_fill_viridis_d ('Svarskategori' ,
direction = - 1 ,
labels = ~ stringr:: str_wrap (.x, width = 15 )) +
theme_rise () +
labs (title = "Svarsfördelning" ,
subtitle = "Samtliga respondenter 2023." ,
x = "Antal svar" ) +
scale_y_discrete (labels = str_wrap (itemlabels %>% filter (itemnr %in% items.kr) %>% pull (item), 15 ))
```
#### 2023 uppdelat på kön
```{r}
colG <- df %>%
filter (Kommun == fokusKommun) %>%
filter (År == 2023 ) %>%
drop_na (Kön) %>%
select (all_of (items.kr),Kön) %>%
filter (! if_any (contains ("C2" ), ~ str_detect (.x, "Vet inte" ))) %>%
#mutate(across(where(is.factor), ~ fct_rev(.x))) %>%
pivot_longer (starts_with ("C2" ), names_to = "itemnr" , values_to = "svarskategori" ) %>%
group_by (Kön) %>%
count (itemnr, svarskategori) %>%
mutate (Nf = factor (n)) %>%
mutate (svarskategori = fct_rev (svarskategori)) %>%
left_join (.,itemlabels, by = "itemnr" ) %>%
ggplot (
aes (
x = svarskategori, y = n, fill = Kön
)
) +
geom_col (position = "dodge" ) +
scale_color_manual ("" ,
values = RISEpalette1[c (1 ,5 )],
aesthetics = c ("fill" , "color" )
) +
scale_y_continuous (position = "right" ,
label = scales:: label_comma (accuracy = 1 ),
minor_breaks = NULL ) +
facet_wrap (~ item,
dir = "v" ,
ncol = 1 ,
strip.position = "left" ,
#labeller = labeller(str_wrap(itemlabels %>% filter(itemnr %in% items.kr) %>% pull(item), 15))
labeller = labeller (item = label_wrap_gen (22 ))
#scales = "free"
) +
theme_rise (stripsize = 10 ,
strip.text.y.left = element_text (angle = 0 ),
legend.position = "top" ,
axis.text.y = element_blank ()) +
xlab ("" ) +
ylab ("" ) +
scale_x_discrete (labels = ~ stringr:: str_wrap (.x, width = 8 ))
```
```{r}
densityG <- df %>%
filter (Kommun == fokusKommun) %>%
filter (År == 2023 ) %>%
drop_na (Kön) %>%
select (all_of (items.kr),Kön) %>%
filter (! if_any (contains ("C2" ), ~ str_detect (.x, "Vet inte" ))) %>%
#mutate(across(where(is.factor), ~ fct_rev(.x))) %>%
pivot_longer (starts_with ("C2" ), names_to = "item" , values_to = "svarskategori" ) %>%
mutate (svar = as.numeric (svarskategori)) %>%
mutate (item = factor (item)) %>%
#mutate(item = fct_rev(item)) %>%
ggplot (
aes (
x = svar, fill = Kön, color = Kön
)) +
geom_density (alpha = 0.6 , stat = "count" ) +
facet_wrap (~ item,
dir = "v" ,
ncol = 1 ) +
scale_x_continuous (limits = c (1 ,5 ),
breaks = c (1 : 5 )
) +
scale_y_continuous (minor_breaks = NULL ) +
scale_color_manual ('Kön' ,
values = RISEpalette1[c (1 ,5 )],
aesthetics = c ("fill" , "color" )
) +
theme_rise (stripsize = 9 ) +
xlab ("" ) +
ylab ("" ) +
theme (legend.position = "none" ) +
theme (
axis.text.x = element_blank (), # remove text from both axes
axis.text.y = element_blank (),
axis.title = element_blank (),
strip.text = element_blank ()
) +
scale_x_reverse ()
```
```{r}
library (patchwork)
#| fig-height: 11
#| fig-width: 9
p20cols <- colG +
theme (plot.margin = unit (c (0 ,0 ,0 ,0 ), 'cm' ))
p20dens <- densityG +
theme (plot.margin = unit (c (0 ,0 ,0 ,0 ), 'cm' ))
# unit(c(top, right, bottom, left), units)
p20cols + p20dens + plot_layout (widths = c (2.3 , 1 ),
heights = )
```
#### Andelar "Vet inte" och saknade svar
```{r}
#| fig-height: 7
df %>%
filter (Kommun == fokusKommun) %>%
select (all_of (items.kr),År,Kön) %>%
filter (År >= 2013 ) %>%
#drop_na(Kön) %>%
pivot_longer (all_of (items.kr), names_to = "Item" , values_to = "Svarskategori" ) %>%
group_by (År,Kön,Item) %>%
count (Svarskategori) %>%
mutate (Andel = 100 * n / sum (n)) %>%
filter (Svarskategori %in% c ("Vet inte" ,NA )) %>%
rename (itemnr = Item) %>%
left_join (.,itemlabels, by = "itemnr" ) %>%
ggplot (aes (x = factor (År), y = Andel, group = Kön, color = Kön, fill = Kön)) +
geom_point (size = 1.8 , alpha = 0.85 ) +
geom_line (linewidth = 1.1 , alpha = 0.85 ) +
#scale_y_continuous(limits = c(0,100), breaks = c(0,20,40,60,80,100)) +
scale_color_manual (values = RISEpalette1[c (1 ,5 )]) +
labs (title = "Andel som svarat 'Vet inte' eller saknar svar" ,
subtitle = "Samtliga årskurser" ) +
ylab ("Andel respondenter i procent" ) +
xlab ("Årtal" ) +
theme_rise () +
facet_grid (item~ Svarskategori,
switch = "y" ,
labeller = label_wrap_gen (width = 25 )) +
theme (strip.text.y.left = element_text (angle = 0 , size = 10 ))
```
#### Andelar "Vet inte" fördelat på årskurs
```{r}
#| fig-height: 7
df %>%
filter (Kommun == fokusKommun) %>%
select (all_of (items.kr),År,Årskurs) %>%
filter (År >= 2013 ) %>%
drop_na (Årskurs) %>%
pivot_longer (items.kr, names_to = "Item" , values_to = "Svarskategori" ) %>%
group_by (År,Årskurs,Item) %>%
count (Svarskategori, .drop = F) %>%
mutate (Andel = 100 * n / sum (n)) %>%
filter (Svarskategori %in% c ("Vet inte" ,NA )) %>%
rename (itemnr = Item) %>%
left_join (.,itemlabels, by = "itemnr" ) %>%
ggplot (aes (x = factor (År), y = Andel, group = Årskurs, color = Årskurs, fill = Årskurs)) +
geom_point (size = 1.8 ,
alpha = 0.85 ) +
geom_line (linewidth = 1.1 ,
alpha = 0.85 ) +
#scale_y_continuous(limits = c(0,100), breaks = c(0,20,40,60,80,100)) +
#scale_color_manual(values = RISEpalette1[c(1,3,5)]) +
scale_color_brewer (palette = "Set1" ) +
labs (title = "Andel som svarat 'Vet inte' eller saknar svar" ,
subtitle = "Samtliga respondenter, uppdelat på årskurs" ) +
ylab ("Andel respondenter i procent" ) +
xlab ("Årtal" ) +
theme_rise () +
facet_grid (item~ Svarskategori,
switch = "y" ,
labeller = label_wrap_gen (width = 25 )) +
theme (strip.text.y.left = element_text (angle = 0 , size = 10 )) +
coord_cartesian (clip = "off" )
```
:::
```{r}
items.kr <- c ("C2_1" ,"C2_3" ,"C2_4" ,"C2_5" ,"C2_6" ,"C2_8" )
df.omit.na <- df %>%
select (all_of (items.kr),Kön,Årskurs) %>%
mutate (across (starts_with ("C2" ), ~ recode (.x,"'Stämmer mycket dåligt'=0;
'Stämmer ganska dåligt'=1;
'Stämmer varken bra eller dåligt'=2;
'Stämmer ganska bra'=3;
'Stämmer mycket bra'=4;
'Vet inte'=NA" ,
as.factor = FALSE )
)) %>%
mutate (C2_8 = recode (C2_8,"4=0;3=1;1=3;0=4" , as.factor = F)) %>% # reverse code one item
na.omit ()
# create DIF vector variables
dif.kön <- df.omit.na$ Kön
dif.årskurs <- df.omit.na$ Årskurs
# remove from item dataframe
df.omit.na$ Kön <- NULL
df.omit.na$ Årskurs <- NULL
```
### Utsatthetsfrågor över tid
```{r}
# prepare dataframe
df.c2 <- df %>%
filter (Kommun == fokusKommun) %>%
drop_na (Kön, Årskurs) %>%
select (all_of (items.kr), Kön, År, Årskurs) %>%
#filter(!if_any(contains("C2"), ~ str_detect(.x, "Vet inte"))) %>%
pivot_longer (starts_with ("C2" ), names_to = "itemnr" , values_to = "svarskategori" ) %>%
group_by (År, Årskurs, Kön, itemnr) %>%
count (svarskategori) %>%
mutate (svarskategori = fct_rev (svarskategori)) %>%
mutate (
Andel = round (100 * n / sum (n), 1 ),
) %>%
ungroup () %>%
left_join (., itemlabels, by = "itemnr" )
```
Svarsalternativet i mitten ("Stämmer varken bra eller dåligt") visas ej.
::: panel-tabset
#### Åk 7
```{r}
#| fig-height: 9
#| fig-width: 9
df.c2 %>%
filter (! svarskategori %in% c ("Stämmer varken bra eller dåligt" ,"Vet inte" ),
År > 2012 ) %>%
categoriesTime ("Åk 7" )
```
#### Åk 9
```{r}
#| fig-height: 9
#| fig-width: 9
df.c2 %>%
filter (! svarskategori %in% c ("Stämmer varken bra eller dåligt" ,"Vet inte" ),
År > 2012 ) %>%
categoriesTime ("Åk 9" )
```
#### Gy 2
```{r}
#| fig-height: 9
#| fig-width: 9
df.c2 %>%
filter (! svarskategori %in% c ("Stämmer varken bra eller dåligt" ,"Vet inte" ),
År > 2012 ) %>%
categoriesTime ("Gy 2" )
```
:::
De två positiva och de två negativa läggs samman för en enklare vy nedan.
```{r}
# prepare dataframe with merged response categories
df.c2.merged <- df.c2 %>%
select (! n) %>%
pivot_wider (
names_from = svarskategori,
values_from = Andel
) %>%
clean_names () %>%
mutate (pos_svar = stammer_mycket_bra+ stammer_ganska_bra,
neg_svar = stammer_ganska_daligt+ stammer_mycket_daligt) %>%
select (ar,arskurs,kon,item,pos_svar,neg_svar) %>%
pivot_longer (c ("pos_svar" ,"neg_svar" ),
names_to = "svarskategori" ,
values_to = "Andel" ) %>%
rename (År = ar,
Årskurs = arskurs,
Kön = kon) %>%
mutate (svarskategori = car:: recode (svarskategori,"'pos_svar'='Positiva svar';
'neg_svar'='Negativa svar'" )) %>%
filter (År > 2012 )
```
### Utsatthetsfrågor förenklad
::: panel-tabset
#### Åk 7
```{r}
#| fig-height: 7
#| fig-width: 9
categoriesTime (df.c2.merged,"Åk 7" )
```
#### Åk 9
```{r}
#| fig-height: 7
#| fig-width: 9
categoriesTime (df.c2.merged,"Åk 9" )
```
#### Gy 2
```{r}
#| fig-height: 7
#| fig-width: 9
categoriesTime (df.c2.merged,"Gy 2" )
```
:::
### Könsskillnader
::: panel-tabset
#### Håller ej med om påståendet
```{r}
#| fig-height: 7
#| fig-width: 9
catTimeComp (df.c2.merged,"Negativa svar" ,"Håller ej med om påståendet" )
```
#### Håller med om påståendet
```{r}
#| fig-height: 7
#| fig-width: 9
catTimeComp (df.c2.merged,"Positiva svar" ,"Håller med om påståendet" )
```
:::
### Skolinspektionen?
Tyvärr är bara Uppsala och Älvkarleby med i Skolinspektionens data, och detta har ännu inte tagits med i lägesbilden.
## Temafrågor om kränkning
```{r}
itemlabels %>%
filter (str_detect (itemnr,"TEMA3" )) %>%
kbl_rise (width = 45 )
itemnr_tema3 <- itemlabels %>%
filter (str_detect (itemnr,"TEMA3" )) %>%
pull (itemnr)
```
### Deskriptiva data TEMA3
::: panel-tabset
#### Antal respondenter per kommun & kön
```{r}
df %>%
select (starts_with ("TEMA3_F" ),Kön,Kommun) %>%
drop_na (any_of (itemnr_tema3),Kommun) %>%
group_by (Kommun,Kön) %>%
reframe (Antal = n ()) %>%
ungroup () %>%
mutate (Kommun = fct_reorder (Kommun, desc (Antal))) %>%
ggplot (aes (x = Kommun, y = Antal, fill = Kön, group = Kön)) +
geom_col (position = "dodge" ) +
geom_text (aes (label = Antal),
position = position_dodge (width = 0.9 ),
hjust = - 0.22 , vjust = 0.5 , angle = 90 , size = 2.7 ,
color = "darkgrey" ) +
#scale_fill_gender() +
scale_fill_manual (values = c ("#009CA6" ,"#F5A127" ,"#5C758B" ),labels = c ("Flickor" ,"Pojkar" ,"Annat/ej svar" )) +
scale_x_discrete ('Kommun' , guide = guide_axis (n.dodge = 1 )) +
scale_y_continuous (limits = c (0 ,NA )) +
labs (title = "Antal respondenter" ,
subtitle = "Fördelat på kön och kommun" ) +
theme_rise () +
coord_cartesian (clip = 'off' )
```
#### Antal respondenter per årskurs & kön
```{r}
df %>%
filter (Kommun == fokusKommun) %>%
select (starts_with ("TEMA3_F" ),Kön,Årskurs) %>%
drop_na (any_of (itemnr_tema3),Årskurs) %>%
group_by (Årskurs,Kön) %>%
summarise (Antal = n ()) %>%
mutate (Årskurs = fct_reorder (Årskurs, desc (Antal))) %>%
ggplot (aes (x = Årskurs, y = Antal, fill = Kön, group = Kön)) +
geom_col (position = "dodge" , color = "white" ) +
geom_text (aes (label = Antal),
position = position_dodge (width = 0.9 ),
hjust = - 0.22 , vjust = 0.5 , angle = 90 , size = 2.7 ,
color = "darkgrey" ) +
scale_fill_manual (values = c ("#009CA6" ,"#F5A127" ,"#5C758B" ),labels = c ("Flickor" ,"Pojkar" ,"Annat/ej svar" )) +
scale_x_discrete ('Årskurs' , guide = guide_axis (n.dodge = 1 )) +
scale_y_continuous (limits = c (0 ,NA )) +
labs (title = paste0 (fokusKommun," - Antal respondenter" ),
subtitle = "Fördelat på kön och årskurs" ) +
theme_rise () +
# remove vertical background lines
theme (
panel.grid.major.x = element_blank (),
panel.grid.minor.x = element_blank ()
)
```
```{r}
#| column: margin
tema3f <- df %>%
select (starts_with ("TEMA3_F" ),Kön,Kommun,Årskurs,År) %>%
drop_na (any_of (itemnr_tema3),Kommun,Årskurs,År) %>%
mutate (across (
starts_with (c ("tema3_f1" ,"tema3_f2" )),
~ recode (.x,"1='Nej, det har inte hänt';
2='Någon eller några gånger';
3='Några gånger i månaden eller oftare';
4='Några gånger i månaden eller oftare';
5='Några gånger i månaden eller oftare'" ,
as.factor = TRUE ))
) %>%
mutate (Kön = recode (Kön,"NA='Annat/ej svar'" )) %>%
mutate (Kön = factor (Kön, levels = c ("Flickor" ,"Pojkar" ,"Annat/ej svar" ),
labels = c ("Flickor" ,"Pojkar" ,"Annat/ej svar" )))
tema3f %>%
select (starts_with (c ("tema3_f1" ,"tema3_f2" ))) %>%
RIlistItemsMargin ()
```
:::
:::: {.column-page-inset}
::: panel-tabset
#### Utsatthet flickor
```{r}
#| fig-height: 8
#| fig-width: 10
tema3f %>%
filter (Kommun == fokusKommun) %>%
select (starts_with (c ("tema3_f1" ,"tema3_f2" )),Kön,Kommun,År,Årskurs) %>%
drop_na (Årskurs,Kommun) %>%
pivot_longer (starts_with (c ("tema3_f1" ,"tema3_f2" )),
names_to = "itemnr" ,
values_to = "svarskategori" ) %>%
group_by (År,itemnr,Årskurs,Kön) %>%
count (svarskategori) %>%
#summarise(Antal = n(svarskategori)) %>%
mutate (Andel = n / sum (n) * 100 ) %>%
ungroup () %>%
left_join (itemlabels, by = "itemnr" ) %>%
filter (Kön == "Flickor" ) %>%
#mutate(item = fct_reorder(item, desc("Andel"))) %>%
mutate (svarskategori = fct_relevel (svarskategori, "Nej, det har inte hänt" ,
"Någon eller några gånger" ,
"Några gånger i månaden eller oftare" )) %>%
ggplot (aes (x = factor (År), y = Andel, color = svarskategori, group = svarskategori)) +
geom_point (size = 1.8 , alpha = 0.85 ) +
geom_line (linewidth = 1.1 , alpha = 0.85 ) +
scale_color_manual ('' ,values = c ("#009ca6" ,"orange" ,"#e83c63" )) +
theme (strip.text = element_text (size = 9 )) +
facet_grid (item~ Årskurs,
scales = "free_x" ,
labeller = labeller (item = label_wrap_gen (32 )),
) +
labs (y = "Antal" ,
x = "År" ,
title = paste0 (fokusKommun," - flickor - 'Har du under de senaste 12 månaderna blivit...'" )
) +
theme_rise (strip.text.y = element_text (angle = 0 , hjust = 1 ),
legend.position = "top" )
```
#### Utsatthet pojkar
```{r}
#| fig-height: 8
#| fig-width: 10
tema3f %>%
filter (Kommun == fokusKommun) %>%
select (starts_with (c ("tema3_f1" ,"tema3_f2" )),Kön,Kommun,År,Årskurs) %>%
drop_na (Årskurs,Kommun) %>%
pivot_longer (starts_with (c ("tema3_f1" ,"tema3_f2" )),
names_to = "itemnr" ,
values_to = "svarskategori" ) %>%
group_by (År,itemnr,Årskurs,Kön) %>%
count (svarskategori) %>%
#summarise(Antal = n(svarskategori)) %>%
mutate (Andel = n / sum (n) * 100 ) %>%
ungroup () %>%
left_join (itemlabels, by = "itemnr" ) %>%
filter (Kön == "Pojkar" ) %>%
#mutate(item = fct_reorder(item, desc("Andel"))) %>%
mutate (svarskategori = fct_relevel (svarskategori, "Nej, det har inte hänt" ,
"Någon eller några gånger" ,
"Några gånger i månaden eller oftare" )) %>%
ggplot (aes (x = factor (År), y = Andel, color = svarskategori, group = svarskategori)) +
geom_point (size = 1.8 , alpha = 0.85 ) +
geom_line (linewidth = 1.1 , alpha = 0.85 ) +
scale_color_manual ('' ,values = c ("#009ca6" ,"orange" ,"#e83c63" )) +
theme (strip.text = element_text (size = 9 )) +
facet_grid (item~ Årskurs,
scales = "free_x" ,
labeller = labeller (item = label_wrap_gen (32 )),
) +
labs (y = "Antal" ,
x = "År" ,
title = paste0 (fokusKommun," - pojkar - 'Har du under de senaste 12 månaderna blivit...'" )
) +
theme_rise (strip.text.y = element_text (angle = 0 , hjust = 1 ),
legend.position = "top" )
```
#### Andel utsatta samtliga årskurser 2017
```{r}
#| fig-height: 8
#| fig-width: 10
tema3f %>%
filter (Kommun == fokusKommun,
År == 2017 ) %>%
select (starts_with (c ("tema3_f1" ,"tema3_f2" )),Kön,Kommun) %>%
pivot_longer (starts_with (c ("tema3_f1" ,"tema3_f2" )),
names_to = "itemnr" ,
values_to = "svarskategori" ) %>%
left_join (itemlabels, by = "itemnr" ) %>%
group_by (item,Kön) %>%
mutate (svarskategori = fct_relevel (svarskategori, "Nej, det har inte hänt" ,
"Någon eller några gånger" ,
"Några gånger i månaden eller oftare" )) %>%
count (svarskategori) %>%
mutate (percent = (100 * n / sum (n)) %>% round (digits = 3 )) %>%
mutate (proportion = (n / sum (n) %>% round (digits = 3 ))) %>%
mutate (sem = sqrt (proportion * (1 - proportion) / sum (n))) %>%
mutate (
lower.95ci = proportion - sem * 1.96 ,
upper.95ci = proportion + sem * 1.96
) %>%
rename (
Svarsalternativ = svarskategori,
"Antal svar" = n,
Procent = percent
) %>%
mutate (
Procent = round (Procent, 1 ),
procentText = sprintf ("%1.1f%%" , Procent)
) %>%
#mutate(svarskategori = fct_reorder(desc("svarskategori"))) %>%
ggplot (aes (x = Svarsalternativ, y = Procent, fill = Kön)) +
geom_bar (position = position_dodge (), stat = "identity" ) +
geom_text (aes (label = ` Antal svar ` ), position = position_dodge (width = 1 ), vjust = - 0.5 ,
color = "darkgrey" , size = 3 ) +
scale_fill_manual ('' ,values = c ("#009CA6" ,"#F5A127" ,"#5C758B" ),labels = c ("Flickor" ,"Pojkar" ,"Annat/ej svar" )) +
theme_rise () +
scale_x_discrete ('' , guide = guide_axis (n.dodge = 1 ),
labels = ~ stringr:: str_wrap (.x, width = 12 )) +
coord_cartesian (ylim = c (0 ,105 )) +
theme (strip.text = element_text (size = 9 ),
legend.position = "top" ) +
facet_wrap (~ item,
scales = "free_x" ,
labeller = labeller (item = label_wrap_gen (32 ))
) +
labs (y = "Andel i %" ,
title = paste0 (fokusKommun," - Andel som blivit utsatta inom respektive kön (2017)" ),
subtitle = "Siffror i grått anger antal respondenter" )
```
#### Andel utsatta samtliga årskurser 2021
```{r}
#| fig-height: 8
#| fig-width: 10
tema3f %>%
filter (Kommun == fokusKommun,
År == 2021 ) %>%
select (starts_with (c ("tema3_f1" ,"tema3_f2" )),Kön,Kommun) %>%
pivot_longer (starts_with (c ("tema3_f1" ,"tema3_f2" )),
names_to = "itemnr" ,
values_to = "svarskategori" ) %>%
left_join (itemlabels, by = "itemnr" ) %>%
group_by (item,Kön) %>%
mutate (svarskategori = fct_relevel (svarskategori, "Nej, det har inte hänt" ,
"Någon eller några gånger" ,
"Några gånger i månaden eller oftare" )) %>%
count (svarskategori) %>%
mutate (percent = (100 * n / sum (n)) %>% round (digits = 3 )) %>%
mutate (proportion = (n / sum (n) %>% round (digits = 3 ))) %>%
mutate (sem = sqrt (proportion * (1 - proportion) / sum (n))) %>%
mutate (
lower.95ci = proportion - sem * 1.96 ,
upper.95ci = proportion + sem * 1.96
) %>%
rename (
Svarsalternativ = svarskategori,
"Antal svar" = n,
Procent = percent
) %>%
mutate (
Procent = round (Procent, 1 ),
procentText = sprintf ("%1.1f%%" , Procent)
) %>%
#mutate(svarskategori = fct_reorder(desc("svarskategori"))) %>%
ggplot (aes (x = Svarsalternativ, y = Procent, fill = Kön)) +
geom_bar (position = position_dodge (), stat = "identity" ) +
geom_text (aes (label = ` Antal svar ` ), position = position_dodge (width = 1 ), vjust = - 0.5 ,
color = "darkgrey" , size = 3 ) +
scale_fill_manual ('' ,values = c ("#009CA6" ,"#F5A127" ,"#5C758B" ), labels = c ("Flickor" ,"Pojkar" ,"Annat/ej svar" )) +
theme_rise () +
scale_x_discrete ('' , guide = guide_axis (n.dodge = 1 ),
labels = ~ stringr:: str_wrap (.x, width = 12 )) +
coord_cartesian (ylim = c (0 ,105 ),
clip = 'off' ) +
theme (strip.text = element_text (size = 9 ),
legend.position = "top" ) +
facet_wrap (~ item,
scales = "free_x" ,
labeller = labeller (item = label_wrap_gen (32 ))
) +
labs (y = "Andel i %" ,
title = paste0 (fokusKommun," - Andel som blivit utsatta inom respektive kön (2021)" ),
subtitle = "Siffror i grått anger antal respondenter" )
```
#### 'Nej, det har inte hänt' (alla)
```{r}
tema3f %>%
filter (Kommun == fokusKommun) %>%
select (starts_with (c ("tema3_f1" ,"tema3_f2" )),Kön,Kommun,Årskurs) %>%
drop_na (Årskurs,Kommun) %>%
pivot_longer (starts_with (c ("tema3_f1" ,"tema3_f2" )),
names_to = "itemnr" ,
values_to = "svarskategori" ) %>%
left_join (itemlabels, by = "itemnr" ) %>%
group_by (Årskurs,item,Kön) %>%
count (svarskategori) %>%
mutate (percent = (100 * n / sum (n)) %>% round (digits = 3 )) %>%
mutate (proportion = (n / sum (n) %>% round (digits = 3 ))) %>%
mutate (sem = sqrt (proportion * (1 - proportion) / sum (n))) %>%
mutate (
lower.95ci = proportion - sem * 1.96 ,
upper.95ci = proportion + sem * 1.96
) %>%
rename (
Svarsalternativ = svarskategori,
"Antal svar" = n,
Procent = percent
) %>%
mutate (
Procent = round (Procent, 1 ),
procentText = sprintf ("%1.1f%%" , Procent)
) %>%
ungroup () %>%
filter (Svarsalternativ == "Nej, det har inte hänt" ) %>%
mutate (item = fct_reorder (item, desc (Procent))) %>%
ggplot (aes (x = item, y = Procent, fill = Kön)) +
geom_bar (position = position_dodge (), stat = "identity" ) +
geom_hline (yintercept = 75 , alpha = 0.8 , color = "darkgrey" , linetype = 2 ) +
geom_text (aes (label = ` Antal svar ` ), position = position_dodge (width = 1 ), vjust = - 0.5 ,
color = "darkgrey" , size = 3 ) +
scale_fill_manual ('' ,values = c ("#009CA6" ,"#F5A127" ,"#5C758B" ), labels = c ("Flickor" ,"Pojkar" ,"Annat/ej svar" )) +
theme_rise () +
scale_x_discrete ('' , guide = guide_axis (n.dodge = 1 ),
labels = ~ stringr:: str_wrap (.x, width = 12 )) +
coord_cartesian (ylim = c (0 ,105 ),
clip = "off" ) +
theme (strip.text = element_text (size = 9 ),
legend.position = "top" ) +
facet_wrap (~ Årskurs,
ncol = 1 ) +
# facet_wrap(~item,
# scales = "free_x",
# labeller = labeller(item = label_wrap_gen(32))
# ) +
labs (y = "Andel i %" ,
title = paste0 (fokusKommun," - Andel som EJ blivit utsatt inom respektive kön" ),
subtitle = "Grå streckad linje är enbart som stödlinje för att underlätta visuella jämförelser"
)
```
:::
::::
## Föräldrafrågor
B16_1, Jag kan prata med någon av mina föräldrar/vårdnadshavare om nästan allt
B16_2, Jag kan alltid lita på någon av mina föräldrar/vårdnadshavare när det verkligen gäller
```{r}
#df %>% distinct(B16_1)
df.fldr <- df %>%
#mutate(across(c(B16_1,B16_2), ~ car::recode(.x,"'Stämmer inte alls' = 0; 'Stämmer ganska dåligt' = 1; 'Stämmer varken bra eller dåligt' = 2; 'Stämmer ganska bra' = 3; 'Stämmer helt och hållet' = 4;'Jag har inte några föräldrar'=NA", as.factor = FALSE)))
mutate (across (c (B16_1,B16_2), ~ car:: recode (.x,"'Jag har inte några föräldrar'=NA" , as.factor = TRUE )))
df.fldr <- df.fldr %>%
select (B16_1,B16_2,År,Kön,Kommun,Årskurs) %>%
drop_na (År,Årskurs,Kommun,B16_1,B16_2) %>%
pivot_longer (starts_with ("B16" ),
names_to = "itemnr" ,
values_to = "svarskategori" ) %>%
left_join (itemlabels, by = "itemnr" ) %>%
group_by (År,Kommun,Årskurs,item,Kön) %>%
count (svarskategori) %>%
mutate (percent = (100 * n / sum (n)) %>% round (digits = 3 )) %>%
mutate (proportion = (n / sum (n) %>% round (digits = 3 ))) %>%
mutate (sem = sqrt (proportion * (1 - proportion) / sum (n))) %>%
mutate (
lower.95ci = proportion - sem * 1.96 ,
upper.95ci = proportion + sem * 1.96
) %>%
rename (
#Svarsalternativ = svarskategori,
"Antal svar" = n,
Procent = percent
) %>%
mutate (
Andel = round (Procent, 1 ),
procentText = sprintf ("%1.1f%%" , Procent),
svarskategori = factor (svarskategori, levels = c ("Stämmer helt och hållet" ,
"Stämmer ganska bra" ,
"Stämmer varken bra eller dåligt" ,
"Stämmer ganska dåligt" ,
"Stämmer inte alls" )
),
Kön = car:: recode (Kön,"NA='Annat/ej svar'" , as.factor = TRUE )
) %>%
ungroup ()
```
:::: {.column-page-left}
### Enbart 2023, båda frågor
```{r}
#| fig-width: 10
df.fldr %>%
filter (Kommun == fokusKommun,
År == 2023 ) %>%
ggplot (aes (x = svarskategori, y = Procent, fill = Kön)) +
geom_bar (position = position_dodge (), stat = "identity" ) +
geom_text (aes (label = ` Antal svar ` ),
position = position_dodge (width = 0.9 ),
hjust = - 0.22 , vjust = 0.5 , angle = 90 , size = 2.7 ,
color = "darkgrey"
) +
scale_fill_manual ('' ,values = c ("#009CA6" ,"#F5A127" ,"#5C758B" ), labels = c ("Flickor" ,"Pojkar" ,"Annat/ej svar" )) +
theme_rise () +
scale_x_discrete ('' , guide = guide_axis (n.dodge = 2 ),
labels = ~ stringr:: str_wrap (.x, width = 12 )) +
coord_cartesian (ylim = c (0 ,105 ),
clip = "off" ) +
theme (strip.text = element_text (size = 9 ),
legend.position = "top" ,
strip.text.y.right = element_text (angle = 0 )) +
facet_grid (item~ Årskurs,
labeller = labeller (item = label_wrap_gen (16 )),
scales = "free"
) +
labs (title = paste0 (fokusKommun, " - enbart 2023" ))
```
### Över tid
::: panel-tabset
#### Åk 7
```{r}
df.fldr %>%
filter (Kommun == fokusKommun,
! svarskategori == c ("Stämmer varken bra eller dåligt" )) %>%
categoriesTime ("Åk 7" )
```
#### Åk 9
```{r}
df.fldr %>%
filter (Kommun == fokusKommun,
! svarskategori == c ("Stämmer varken bra eller dåligt" )) %>%
categoriesTime ("Åk 9" )
```
#### Gy 2
```{r}
df.fldr %>%
filter (Kommun == fokusKommun,
! svarskategori == c ("Stämmer varken bra eller dåligt" )) %>%
categoriesTime ("Gy 2" )
```
:::
::::
## Fritid
E3_3, "Hur ofta brukar du göra följande på din fritid?: Delta i aktiviteter i en församling, idrottsförening och/eller annan förening"
```{r}
#df %>% distinct(E3_3)
df.fritid <-
df %>%
select (E3_3,År,Kön,Kommun,Årskurs) %>%
drop_na (År,Årskurs,Kommun,E3_3) %>%
pivot_longer (E3_3,
names_to = "itemnr" ,
values_to = "svarskategori" ) %>%
left_join (itemlabels, by = "itemnr" ) %>%
group_by (År,Kommun,Årskurs,item,Kön) %>%
count (svarskategori) %>%
mutate (percent = (100 * n / sum (n)) %>% round (digits = 3 )) %>%
mutate (proportion = (n / sum (n) %>% round (digits = 3 ))) %>%
mutate (sem = sqrt (proportion * (1 - proportion) / sum (n))) %>%
mutate (
lower.95ci = proportion - sem * 1.96 ,
upper.95ci = proportion + sem * 1.96
) %>%
rename (
#Svarsalternativ = svarskategori,
"Antal svar" = n,
Procent = percent
) %>%
mutate (
Andel = round (Procent, 1 ),
procentText = sprintf ("%1.1f%%" , Procent),
svarskategori = factor (svarskategori, levels = c ("Varje dag eller nästan varje dag" ,
"Några gånger i veckan" ,
"Några gånger i månaden" ,
"Mer sällan" ,
"Aldrig" )
),
Kön = car:: recode (Kön,"NA='Annat/ej svar'" , as.factor = TRUE )
) %>%
ungroup ()
```
### Enbart 2023
```{r}
df.fritid %>%
filter (Kommun == fokusKommun,
År == 2023 ) %>%
ggplot (aes (x = svarskategori, y = Procent, fill = Kön)) +
geom_bar (position = position_dodge (), stat = "identity" ) +
geom_text (aes (label = ` Antal svar ` ),
position = position_dodge (width = 0.9 ),
hjust = - 0.22 , vjust = 0.5 , angle = 90 , size = 2.7 ,
color = "darkgrey"
) +
scale_fill_manual ('' ,values = c ("#009CA6" ,"#F5A127" ,"#5C758B" ), labels = c ("Flickor" ,"Pojkar" ,"Annat/ej svar" )) +
theme_rise () +
scale_x_discrete ('' , guide = guide_axis (n.dodge = 2 ),
labels = ~ stringr:: str_wrap (.x, width = 12 )) +
coord_cartesian (ylim = c (0 ,60 ),
clip = "off" ) +
theme (strip.text = element_text (size = 9 ),
legend.position = "top" ,
strip.text.y.right = element_text (angle = 0 )) +
facet_wrap (~ Årskurs,
labeller = labeller (item = label_wrap_gen (16 )),
scales = "free"
) +
labs (title = paste0 (fokusKommun, " - enbart 2023" ))
```
### Över tid
Vi slår ihop "Mer sällan" och "Aldrig" till "Sällan eller aldrig", samt "Varje dag eller nästan varje dag" och "Några gånger i veckan" till "Flera gånger i veckan"
```{r}
df.fritid2 <-
df %>%
select (E3_3,År,Kön,Kommun,Årskurs) %>%
drop_na (År,Årskurs,Kommun,E3_3) %>%
mutate (E3_3 = dplyr:: recode (E3_3, "Varje dag eller nästan varje dag" = "Flera gånger i veckan" ,
"Några gånger i veckan" = "Flera gånger i veckan" ,
"Mer sällan" = "Sällan eller aldrig" ,
"Aldrig" = "Sällan eller aldrig" )) %>%
pivot_longer (E3_3,
names_to = "itemnr" ,
values_to = "svarskategori" ) %>%
left_join (itemlabels, by = "itemnr" ) %>%
group_by (År,Kommun,Årskurs,item,Kön) %>%
count (svarskategori) %>%
mutate (percent = (100 * n / sum (n)) %>% round (digits = 3 )) %>%
mutate (proportion = (n / sum (n) %>% round (digits = 3 ))) %>%
mutate (sem = sqrt (proportion * (1 - proportion) / sum (n))) %>%
mutate (
lower.95ci = proportion - sem * 1.96 ,
upper.95ci = proportion + sem * 1.96
) %>%
rename (
#Svarsalternativ = svarskategori,
"Antal svar" = n,
Procent = percent
) %>%
mutate (
Andel = round (Procent, 1 ),
procentText = sprintf ("%1.1f%%" , Procent),
svarskategori = factor (svarskategori, levels = c ("Flera gånger i veckan" ,
"Några gånger i månaden" ,
"Sällan eller aldrig" )
),
Kön = car:: recode (Kön,"NA='Annat/ej svar'" , as.factor = TRUE )
) %>%
ungroup ()
```
::: panel-tabset
#### Åk 7
```{r}
#| fig-height: 5
df.fritid2 %>%
filter (Kommun == fokusKommun) %>%
categoriesTime ("Åk 7" ) +
labs (subtitle = "" )
```
#### Åk 9
```{r}
#| fig-height: 5
df.fritid2 %>%
filter (Kommun == fokusKommun) %>%
categoriesTime ("Åk 9" ) +
labs (subtitle = "" )
```
#### Gy 2
```{r}
#| fig-height: 5
df.fritid2 %>%
filter (Kommun == fokusKommun) %>%
categoriesTime ("Gy 2" ) +
labs (subtitle = "" )
```
:::
### 'Sällan eller aldrig' över tid/årskurs
```{r}
df.fritid2 %>%
filter (Kommun == fokusKommun,
svarskategori == "Sällan eller aldrig" ) %>%
ggplot (aes (x = År, y = Procent, color = Kön, group = Kön)) +
geom_line (alpha = 0.9 , linewidth = 1 ) +
geom_point (alpha = 0.9 , size = 2 ) +
scale_x_continuous (guide = guide_axis (n.dodge = 2 ),
breaks = seq (2010 , 2023 , 1 )) +
scale_y_continuous (limits = c (0 , 100 )) +
scale_color_manual ('' ,values = c ("#009CA6" ,"#F5A127" ,"#5C758B" ), labels = c ("Flickor" ,"Pojkar" ,"Annat/ej svar" )) +
ylab ("Andel i %" ) +
xlab ("" ) +
facet_wrap (~ Årskurs) +
theme_rise (stripsize = 10 ) +
theme (legend.position = "top" ) +
labs (caption = "Datakälla: Liv och Hälsa Ung" ,
title = paste0 (fokusKommun," - 'Sällan eller aldrig' deltar i organiserade fritidsaktiviteter" ))
```
## Pojkar med "dysregulation profile"
Utifrån SDQ-frågor och psykometrisk analys av de 15 items som ingår i "SDQ Dysregulation Profile" (Deutz et al, 2018)[ http://doi.apa.org/getdoi.cfm?doi=10.1037/pas0000564 ] har mätvärden kunnat tas fram där en ansats till att bedöma ett gränsvärde görs och vi kan utifrån detta klassificera riskgruppstillhörighet.
## KOLADA
```{r}
KOLADA <- read_parquet ("data/2023-09-12_KOLADA_data_ready.parquet" )
Municipalities <- read_parquet ("data/2023-03-28_KOLADA_Municipality_list.parquet" )
UppsalaLänsKommuner <- Municipalities %>%
filter (str_detect (id,"^03" )) %>%
pull (title)
kpi_mean <- KOLADA %>%
group_by (KPI, kpi, År) %>%
summarise_at (vars (Andel), list (Andel = mean)) %>%
add_column (Kommun = "Medel riket" , .before = "KPI" ) %>%
add_column (Kön = "Alla" )
KOLADA <- rbind (KOLADA, kpi_mean)
KOLADA <- KOLADA %>%
filter (Kommun %in% UppsalaLänsKommuner,
År > 2009 )
årtal = seq (from = 2010 ,
to = 2023 ,
by = 1 )
DIDkoladaPlotLHU <- function (data) {
data %>%
ggplot (aes (x = År, y = Andel, group = Kommun, color = Kommun)) +
geom_line (alpha = 0.5 , linewidth = 0.8 , linetype = 3 ) +
geom_point (alpha = 0.5 , size = 2 ) +
geom_line (data = filter ({{data}}, Kommun == fokusKommun), alpha = 1 ) +
geom_point (data = filter ({{data}}, Kommun == fokusKommun), alpha = 1 ) +
geom_smooth (method = "lm" ,
aes (group = 1 ),
alpha = 0.12 ,
color = "darkblue" ,
linewidth = 0 ,
linetype = 2 ) +
scale_x_continuous (guide = guide_axis (n.dodge = 2 ),
breaks = seq (2010 , 2022 , 2 )) +
#scale_y_continuous(limits = c(0, 100)) +
scale_color_brewer (type = "qual" , palette = "Dark2" ) +
ylab ("Andel i %" ) +
xlab ("" ) +
facet_wrap (~ KPI,
ncol = 2 ,
scales = "free" ,
labeller = labeller (KPI = label_wrap_gen (22 ))) +
theme_rise (stripsize = 10 ) +
theme (legend.position = "top" ) +
labs (caption = "Ljusgrått fält visar en oviktad trendlinjes 95% konfidensintervall. \n Datakälla: Kolada" )
}
DIDkoladaPlotGlhu <- function (data) {
data %>%
mutate (Kön = fct_rev (Kön)) %>%
ggplot (aes (x = År, y = Andel, group = Kön, color = Kön)) +
geom_line (alpha = 0.8 , linewidth = 0.8 ) +
geom_point (alpha = 0.8 , size = 1.6 ) +
#geom_line(data = filter({{data}}, Kommun == fokusKommun), alpha = 1) +
#geom_point(data = filter({{data}}, Kommun == fokusKommun), alpha = 1) +
geom_smooth (method = "lm" ,
aes (group = 1 ),
alpha = 0.12 ,
color = "darkblue" ,
linewidth = 0 ,
linetype = 2 ) +
scale_x_continuous (guide = guide_axis (n.dodge = 2 ),
breaks = seq (2010 , 2022 , 2 )) +
#scale_y_continuous(limits = c(0, 100)) +
scale_color_manual (values = RISEpalette1[c (1 ,5 )]) +
ylab ("Andel i %" ) +
xlab ("" ) +
facet_grid (Kommun~ KPI,
scales = "free" ,
labeller = labeller (KPI = label_wrap_gen (22 ))) +
theme_rise (stripsize = 10 ) +
theme (legend.position = "top" ) +
labs (caption = "Ljusgrått fält visar en oviktad trendlinjes 95% konfidensintervall. \n Datakälla: Kolada" )
}
```
::: panel-tabset
#### Förskola 0-100
```{r}
#| fig-height: 8
KOLADA %>%
filter (Kön == "Alla" ) %>%
filter (KPI %in% c ("Barn 3-5 år inskrivna i förskola, andel (%)" ,
"Heltidstjänster i förskola med pedagogisk högskoleexamen, lägeskommun, andel (%)" ,
"Heltidstjänster i förskola med pedagogisk högskoleexamen, enskild regi, andel (%)" ,
"Heltidstjänster i förskola med pedagogisk högskoleexamen, kommunal regi, andel (%)" )
) %>%
DIDkoladaPlot () + scale_y_continuous (limits = c (0 , 100 ))
```
#### Förskola "inzoomad"
```{r}
#| fig-height: 8
KOLADA %>%
filter (Kön == "Alla" ) %>%
filter (KPI %in% c ("Barn 3-5 år inskrivna i förskola, andel (%)" ,
"Heltidstjänster i förskola med pedagogisk högskoleexamen, lägeskommun, andel (%)" ,
"Heltidstjänster i förskola med pedagogisk högskoleexamen, enskild regi, andel (%)" ,
"Heltidstjänster i förskola med pedagogisk högskoleexamen, kommunal regi, andel (%)" )
) %>%
DIDkoladaPlot ()
```
#### Grundskola 0-100
```{r}
#| fig-height: 8
KOLADA %>%
filter (Kön == "Alla" ) %>%
filter (KPI %in% c ("Lärare med pedagogisk högskoleexamen i grundskola åk 1-9, lägeskommun, andel (%)" ,
"Lärare (heltidstjänster) med lärarlegitimation och behörighet i minst ett ämne i grundskola åk 1-9, lägeskommun, andel (%)" ,
"Elever i åk 9 som är behöriga till yrkesprogram, hemkommun, andel (%)" ,
"Elever vars föräldrar har eftergymnasial utbildning, åk 1-9 i lägeskommun, andel (%)" )
) %>%
DIDkoladaPlot () + scale_y_continuous (limits = c (0 , 100 ))
```
#### Grundskola inzoomad
```{r}
#| fig-height: 8
KOLADA %>%
filter (Kön == "Alla" ) %>%
filter (KPI %in% c ("Lärare med pedagogisk högskoleexamen i grundskola åk 1-9, lägeskommun, andel (%)" ,
"Lärare (heltidstjänster) med lärarlegitimation och behörighet i minst ett ämne i grundskola åk 1-9, lägeskommun, andel (%)" ,
"Elever i åk 9 som är behöriga till yrkesprogram, hemkommun, andel (%)" ,
"Elever vars föräldrar har eftergymnasial utbildning, åk 1-9 i lägeskommun, andel (%)" )
) %>%
DIDkoladaPlot ()
```
#### Gymnasie 0-100
```{r}
#| fig-height: 8
KOLADA %>%
filter (Kön == "Alla" ) %>%
filter (KPI %in% c ("Lärare med pedagogisk högskoleexamen i gymnasieskola, lägeskommun, andel (%)" ,
"Gymnasieelever som uppnått grundläggande behörighet till universitet och högskola inom 4 år, hemkommun, andel (%)" ,
"Gymnasieelever med indraget studiestöd pga. ogiltig frånvaro, hemkommun, andel (%)" )
) %>%
DIDkoladaPlot () + scale_y_continuous (limits = c (0 , 100 ))
```
#### Gymnasie inzoomad
```{r}
#| fig-height: 8
KOLADA %>%
filter (Kön == "Alla" ) %>%
filter (KPI %in% c ("Lärare med pedagogisk högskoleexamen i gymnasieskola, lägeskommun, andel (%)" ,
"Gymnasieelever som uppnått grundläggande behörighet till universitet och högskola inom 4 år, hemkommun, andel (%)" ,
"Gymnasieelever med indraget studiestöd pga. ogiltig frånvaro, hemkommun, andel (%)" )
) %>%
DIDkoladaPlot ()
```
#### Kamrater & fritid 0-100
```{r}
#| fig-height: 9
KOLADA %>%
filter (Kön == "Alla" ) %>%
filter (KPI %in% c (
"Deltagartillfällen i idrottsföreningar, antal/inv 7-20 år" ,
"Deltagartillfällen i idrottsföreningar, antal/inv 13-20 år" ,
"Aktivitetstillfällen för barn och unga i kommunala bibliotek, antal/1000 inv 0-18 år" ,
"Elever i musik- eller kulturskola, 6-15 år, andel (%)"
)) %>%
DIDkoladaPlot () + scale_y_continuous (limits = c (0 , 100 ))
```
#### Kamrater & fritid inzoomad
```{r}
#| fig-height: 9
KOLADA %>%
filter (Kön == "Alla" ) %>%
filter (KPI %in% c (
"Deltagartillfällen i idrottsföreningar, antal/inv 7-20 år" ,
"Deltagartillfällen i idrottsföreningar, antal/inv 13-20 år" ,
"Aktivitetstillfällen för barn och unga i kommunala bibliotek, antal/1000 inv 0-18 år" ,
"Elever i musik- eller kulturskola, 6-15 år, andel (%)"
)) %>%
DIDkoladaPlot ()
```
#### Kamrater & fritid (per kön)
```{r}
#| fig-height: 5
KOLADA %>%
filter (Kön %in% c ("Flicka" ,"Pojke" )) %>%
filter (KPI %in% c (
"Deltagartillfällen i idrottsföreningar, antal/inv 7-20 år" ,
"Deltagartillfällen i idrottsföreningar, antal/inv 13-20 år" ,
"Aktivitetstillfällen för barn och unga i kommunala bibliotek, antal/1000 inv 0-18 år" ,
"Elever i musik- eller kulturskola, 6-15 år, andel (%)"
)) %>%
DIDkoladaPlotG ()
```
#### Närsamhälle
```{r}
#| fig-height: 11
KOLADA %>%
filter (Kön == "Alla" ) %>%
filter (KPI %in% c ("Invånare 0-19 år i ekonomiskt utsatta hushåll, andel (%)" ,
"Trångboddhet i flerbostadshus, enligt norm 2, andel (%)" ,
"Trångboddhet i flerbostadshus, enligt norm 3, andel (%)" ,
"Anmälda brott om skadegörelse per 1 000 inv." ,
"Anmälda stöld- och tillgreppsbrott, antal/1000 inv" ,
"Barnbokslån i kommunala bibliotek, antal/barn 0-17 år" )
) %>%
DIDkoladaPlot () + scale_y_continuous (limits = c (0 , 100 ))
```
#### Närsamhälle zoomad
```{r}
#| fig-height: 11
KOLADA %>%
filter (Kön == "Alla" ) %>%
filter (KPI %in% c ("Invånare 0-19 år i ekonomiskt utsatta hushåll, andel (%)" ,
"Trångboddhet i flerbostadshus, enligt norm 2, andel (%)" ,
"Trångboddhet i flerbostadshus, enligt norm 3, andel (%)" ,
"Anmälda brott om skadegörelse per 1 000 inv." ,
"Anmälda stöld- och tillgreppsbrott, antal/1000 inv" )
) %>%
DIDkoladaPlot ()
```
:::
## Skolverkets databas
:::: column-page-left
::: panel-tabset
### Lärare/specped jämförelse
```{r}
#| fig-height: 8
viz.gr.skolverket %>%
filter (description %in% c ("Andel legitimerade lärare" ,
"Elever per lärare" ,
"Elever per specialpedagog" )) %>%
DIDskolverketPlot () +
scale_y_continuous (limits = c (0 , NA ))
```
### Lärare/specped fokuskommun
```{r}
#| fig-height: 8
viz.gr.skolverket %>%
filter (description %in% c ("Andel legitimerade lärare" ,
"Elever per lärare" ,
"Elever per specialpedagog" )) %>%
DIDskolverketPlotSingle () +
scale_y_continuous (limits = c (0 , NA ))
```
### Behörighet & meritvärde jämförelse
```{r}
#| fig-height: 8
viz.gr.skolverket %>%
filter (description %in% c ("Andel elever i 9:e klass med fullständiga betyg" ,
"Andel elever i 9:e klass behöriga till yrkesprogram" ,
"Medelvärde meritvärde" )) %>%
DIDskolverketPlot () +
scale_y_continuous (limits = c (50 , NA ))
```
### Behörighet & meritvärde fokuskommun
```{r}
#| fig-height: 8
viz.gr.skolverket %>%
filter (description %in% c ("Andel elever i 9:e klass med fullständiga betyg" ,
"Andel elever i 9:e klass behöriga till yrkesprogram" ,
"Medelvärde meritvärde" )) %>%
DIDskolverketPlotSingle () +
scale_y_continuous (limits = c (50 , NA ))
```
### Nationella prov jämförelse
```{r}
#| fig-height: 10
viz.gr.skolverket %>%
filter (description %in% c ("Medelvärde nationella prov matematik 6:e klass" ,
"Medelvärde nationella prov matematik 9:e klass" ,
"Medelvärde nationella prov svenska 6:e klass" ,
"Medelvärde nationella prov svenska 9:e klass" ,
"Medelvärde nationella prov engelska 6:e klass" ,
"Medelvärde nationella prov engelska 9:e klass" )) %>%
DIDskolverketPlot () +
scale_y_continuous (limits = c (0 , 20 ))
```
### Nationella prov fokuskommun
```{r}
#| fig-height: 10
viz.gr.skolverket %>%
filter (description %in% c ("Medelvärde nationella prov matematik 6:e klass" ,
"Medelvärde nationella prov matematik 9:e klass" ,
"Medelvärde nationella prov svenska 6:e klass" ,
"Medelvärde nationella prov svenska 9:e klass" ,
"Medelvärde nationella prov engelska 6:e klass" ,
"Medelvärde nationella prov engelska 9:e klass" )) %>%
DIDskolverketPlotSingle () +
scale_y_continuous (limits = c (0 , 20 ))
```
:::
::::